import { constantRoutes, routerMap } from '@/router'
import Layout from '@/views/layout/Layout'
import permissionJson from './permissionJson'
import permissionJsonAdmin from './permissionJsonAdmin'

function generateAsyncRouter(routerMap, serverRouterMap) {
    serverRouterMap.forEach(function (item, index) {
        item.component = routerMap[item.component]
        if (item.children && item.children.length > 0) {
            generateAsyncRouter(routerMap, item.children)
        }
    })
    return serverRouterMap;
}
/**
 * 通过meta.role判断是否与当前用户权限匹配
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
    if (route.meta && route.meta.roles) {
        return roles.some(role => route.meta.roles.includes(role))
    } else {
        return true
    }
}

function getHomeRoutes(roles) {
    var home = {
        path: '/',
        component: Layout,
        redirect: '/homePage',
        meta: {
            title: '首页',
            icon: 'guide'
        },
        children: [

        ]
    }
    return home;
}
/**
 * 递归过滤异步路由表，返回符合用户角色权限的路由表
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, roles) {
    const res = []

    routes.forEach(route => {
        const tmp = { ...route }
        if (hasPermission(roles, tmp)) {
            if (tmp.children) {
                tmp.children = filterAsyncRoutes(tmp.children, roles)
            }
            res.push(tmp)
        }
    })

    return res
}

const permission = {
    state: {
        routes: [],
        addRoutes: []
    },
    mutations: {
        SET_ROUTES: (state, routes) => {
            state.addRoutes = routes
            state.routes = constantRoutes.concat(routes)
        }
    },
    actions: {
        GenerateRoutes({ commit }, data) {
            return new Promise(resolve => {
                const { roles } = data
                //serverRouterMap().then(response => {
                let accessedRouters
                // let jsons = response.data.data;
                let jsons
                if (Number(sessionStorage.getItem("adminBoolean"))) {
                    jsons = permissionJsonAdmin
                } else {
                    jsons = permissionJson
                }
                var asyncRouterMap = generateAsyncRouter(routerMap, jsons)
                accessedRouters = filterAsyncRoutes(asyncRouterMap, roles)
                var res = accessedRouters.concat({ path: '*', redirect: '/404', hidden: true })
                res.unshift(getHomeRoutes(roles))
                commit('SET_ROUTES', res)
                resolve(res)
                //   })
            })
        }
    }
}

export default permission
